import os
import shutil
from git import Repo, Git

def sync_git_folder(
    source_repo_url: str,
    target_repo_url: str,
    folder_path: str,
    target_folder_path: str = None,
    source_branch: str = "main",
    target_branch: str = "main",
    clone_parent_dir: str = "/tmp"
):
    """
    同步两个Git仓库的指定文件夹
    
    :param source_repo_url: 源仓库URL
    :param target_repo_url: 目标仓库URL
    :param folder_path: 要同步的源仓库文件夹路径（相对路径）
    :param target_folder_path: 目标仓库中的目标路径（相对路径，默认同folder_path）
    :param source_branch: 源分支
    :param target_branch: 目标分支
    :param clone_parent_dir: 临时克隆目录的父目录
    """
    
    # 设置目标文件夹路径（如果未指定）
    target_folder_path = target_folder_path or folder_path

    # 创建临时目录路径
    source_clone_path = os.path.join(clone_parent_dir, "source_repo")
    target_clone_path = os.path.join(clone_parent_dir, "target_repo")

    # 克隆/打开源仓库
    if os.path.exists(source_clone_path):
        source_repo = Repo(source_clone_path)
        source_repo.git.checkout(source_branch)
        source_repo.remotes.origin.pull()
    else:
        source_repo = Repo.clone_from(source_repo_url, source_clone_path, branch=source_branch)

    # 克隆/打开目标仓库
    if os.path.exists(target_clone_path):
        target_repo = Repo(target_clone_path)
        target_repo.git.checkout(target_branch)
        target_repo.remotes.origin.pull()
    else:
        target_repo = Repo.clone_from(target_repo_url, target_clone_path, branch=target_branch)

    # 确保仓库是干净的
    if target_repo.is_dirty():
        raise Exception("目标仓库存在未提交的修改")

    # 准备完整路径
    source_folder_full = os.path.join(source_clone_path, folder_path)
    target_folder_full = os.path.join(target_clone_path, target_folder_path)

    # 删除目标文件夹（如果存在）
    if os.path.exists(target_folder_full):
        shutil.rmtree(target_folder_full)
    else:
        os.makedirs(os.path.dirname(target_folder_full), exist_ok=True)

    # 复制文件夹内容
    shutil.copytree(source_folder_full, target_folder_full)

    # 提交更改
    target_repo.git.add(A=True)
    if target_repo.index.diff("HEAD"):
        target_repo.index.commit(f"Sync folder: {folder_path} from {source_repo_url}")
        target_repo.remotes.origin.push(target_branch)

    # 清理临时目录（按需启用）
    # shutil.rmtree(source_clone_path)
    # shutil.rmtree(target_clone_path)

if __name__ == "__main__":
    # 使用示例
    sync_git_folder(
        source_repo_url="https://github.com/source/repo.git",
        target_repo_url="https://github.com/target/repo.git",
        folder_path="docs",
        target_folder_path="docs",
        source_branch="main",
        target_branch="gh-pages",
        clone_parent_dir="./temp"
    )